{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Jupyter Notebook 交互式笔记本, 学习和应用。\n",
    "**工于善其事，避险利其器.**\n",
    "\n",
    "Jupyter Notebook 支持运行 40 多种编程语言;\n",
    "便于创建和共享文学化程序文档；\n",
    "支持实时代码，数学方程，可视化和 markdown。 用途包括：数据清理和转换，数值模拟，统计建模，机器学习等。\n",
    "\n",
    "* 基础应用\n",
    "* 数据可视化处理\n",
    "* 文档共享\n",
    "\n",
    "## Jupyter notebook安装与配置（略）\n",
    "\n",
    "*参考：*\n",
    "\n",
    "[jupyter github project](https://github.com/jupyter/notebook)\n",
    "\n",
    "[Anaconda](https://www.anaconda.com/download/)\n",
    "\n",
    "\n",
    "## 快速了解\n",
    "\n",
    "* 熟悉主界面\n",
    "    * notebook 的名称\n",
    "    * 主工具栏，提供了保存、导出、重载 notebook，以及重启内核等选项\n",
    "    * 快捷键\n",
    "    * notebook 主要区域，包含了 notebook 的内容编辑区，由被称为单元格（cell）的部分组成。每个 notebook 由多个单元格构成，而每个单元格又可以有不同的用途。\n",
    "    * notebook 有一个非常有趣的特性，就是可以修改之前的单元格，对其重新计算，这样就可以更新整个文档了。\n",
    "\n",
    "\n",
    "* 获取帮助\n",
    "    + 使用引导\n",
    "    + 参考快捷键，及自定义快捷键\n",
    "    + Mardown语法 \n",
    "    \n",
    "    \n",
    "* 新建笔记本及cell相关基础操作\n",
    "    + 新建不同编码类型的笔记本\n",
    "    + 新建不同类型的cell\n",
    "    + cell的插入编辑，代码执行\n",
    "        _ 如果想删除某个单元格，可以选择该单元格，然后依次点击Edit -> Delete Cell；\n",
    "        - 如果想移动某个单元格，只需要依次点击Edit -> Move cell [up | down]；\n",
    "        - 如果想剪贴某个单元测，可以先点击Edit -> Cut Cell，然后在点击Edit -> Paste Cell [Above | Below]；\n",
    "        - 如果你的 notebook 中有很多单元格只需要执行一次，或者想一次性执行大段代码，那么可以选择合并这些单元格。点击Edit -> Merge Cell [Above | below]。\n",
    "\n",
    "\n",
    "* 多种格式文档导出\n",
    "\n",
    "    *需要安装Pandoc*\n",
    "    [Pandoc 下载地址](https://github.com/jgm/pandoc/releases/tag/2.1.3)\n",
    "\n",
    "    + HTML\n",
    "    + Markdown\n",
    "    + ReST\n",
    "    + PDF（通过 LaTeX）\n",
    "    + Raw Python\n",
    "    + 导出 PDF 功能，甚至，你可以导出为 ReST 格式，作为软件库的文档。\n",
    "    \n",
    "\n",
    "\n",
    "## 可视化数据处理，以python为例\n",
    "\n",
    "* Jupyter Magic命令\n",
    "  + 设置环境变量\n",
    "  + 在notebook里作图\n",
    "  + 运行python代码\n",
    "  + 从外部脚本中插入代码\n",
    "  + 在notebook文件之间传递变量\n",
    "  + 列出所有的全局变量\n",
    "  + 计时\n",
    "  + 用pdb调试程序\n",
    "  \n",
    "\n",
    "* 常用的数据处理组合：**pandas， numpy，matplotlib**\n",
    "\n",
    "  + 参见以下基本示例，有兴趣的可以关注pandas大数据处理*\n",
    "  \n",
    "  + [《利用Python进行数据分析·第2版》](https://ask.hellobi.com/blog/python_shequ/11473)\n",
    "  \n",
    "  \n",
    "\n",
    "## 文档共享\n",
    "\n",
    "* Gitlab + [MkDocs](https://www.mkdocs.org/#installation) 创建个人博客\n",
    "    + 最简单的方式是代码托管的方式，创建同步的代码库即可\n",
    "    + 比较美观的方式是个人主页的方式，有很多如github.io, Sphinx, readthedocs, MkDocs等可以方便的发布为个人博客\n",
    "    + [MkDocs中文文档](https://markdown-docs-zh.readthedocs.io/zh_CN/latest/user-guide/writing-your-docs/)\n",
    "    *MkDocs与Python官方文档Sphinx机制一样*\n",
    "    \n",
    "* [Jupyter Hub](http://jupyter.org/hub) 团队分享\n",
    "\n",
    "    *Hub依赖node.js windows 办公机不方便安装npm包，大家可以在自家电脑上尝试*\n",
    "\n",
    "* 分享到 [Conference](http://iqsz-d6889:8090/pages/viewpage.action?pageId=4260043)\n",
    "    + 将笔记整体保存为Mardown文件： File->Download as -> Markdown(.md) xxxxx.md\n",
    "    + 使用文本编辑器打开 xxxxx.md,\n",
    "    + 在Conference 上创建 空白 page，\n",
    "    + 添加标题之后，选择工具栏 插入->wiki标记->Markdown\n",
    "    + 将内容复制保存即可，这样就可以保持美观的格式了，不用重新做繁琐的排版了。\n",
    "\n",
    "\n",
    "## 引子：拓展和继续深入\n",
    "\n",
    "* [下一代Notebook: Jupyter Lab ](https://jupyterlab.readthedocs.io/en/stable/)\n",
    "* [公共分享notebook: nbviewer ](https://nbviewer.jupyter.org/)\n",
    "* [交互式可视化: Interactive Widgets](https://jupyter.org/widgets)\n",
    "* [科学计算包: Anaconda](https://www.anaconda.com/)\n",
    "* [多种主流语言支持](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels)\n",
    "* [数据分析](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks)\n",
    "* [机器学习](https://docs.microsoft.com/zh-cn/azure/hdinsight/spark/apache-spark-ipython-notebook-machine-learning)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "IPython.notebook.set_autosave_interval(0)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Autosave disabled\n"
     ]
    }
   ],
   "source": [
    "# Jupyter notebook 自动保持间隔设置; 默认为2min，0 为关闭自动保存\n",
    "%autosave 0\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "## 数据处理和图标展示\n",
    "\n",
    "* Hello World"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello World\n"
     ]
    }
   ],
   "source": [
    "\n",
    "print(\"Hello World\")\n",
    "# 修改之前的单元格，对其重新执行\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 典型的二维数据表格,及图表示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>one1</th>\n",
       "      <th>two</th>\n",
       "      <th>three</th>\n",
       "      <th>four</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Ohio</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Colorado</th>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Utah</th>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>New York</th>\n",
       "      <td>12</td>\n",
       "      <td>13</td>\n",
       "      <td>14</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          one1  two  three  four\n",
       "Ohio         0    1      2     3\n",
       "Colorado     4    5      6     7\n",
       "Utah         8    9     10    11\n",
       "New York    12   13     14    15"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # 典型的二维数据表格示例\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# import mat\n",
    "data = pd.DataFrame(np.arange(16).reshape((4, 4)),\n",
    "                    index=['Ohio', 'Colorado', 'Utah', 'New York'],\n",
    "                    columns=['one1', 'two', 'three', 'four'])\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": false,
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x6829530>,\n",
       " <matplotlib.lines.Line2D at 0x68295f0>,\n",
       " <matplotlib.lines.Line2D at 0x68296b0>,\n",
       " <matplotlib.lines.Line2D at 0x6829770>]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.plot(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"432\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x19ef86d0>]"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "x = np.arange(20)\n",
    "y = x**2\n",
    "\n",
    "plt.plot(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#正弦图\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "x = np.linspace(0,1,450)\n",
    "for iX in range(1,9,1):\n",
    "    plt.plot(x,np.sin(np.pi*x)*np.sin(2*iX*np.pi*x)) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Jupyter Magic命令\n",
    "\n",
    "*不同版本的notebook magic命令可能有所不同*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true,
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "env: STATIC_COUNT=4\n"
     ]
    }
   ],
   "source": [
    " # %env：设置环境变量\n",
    "%env STATIC_COUNT=4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello World! \n"
     ]
    }
   ],
   "source": [
    "# %run: 运行python代码\n",
    "%run ./helloworld.ipynb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [],
   "source": [
    "# %load：从外部脚本中插入代码\n",
    "%load D:\\Users\\bianhaiyuan198\\DevelopProject\\gulf_project\\temp_src\\temp.py\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "a =123"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stored 'data123' (str)\n"
     ]
    }
   ],
   "source": [
    "# %store: 在notebook文件之间传递变量\n",
    "# %store 命令可以在两个notebook文件之间传递变量。\n",
    "\n",
    "data123 = 'this is the string can be pass to another notebook'\n",
    "%store data\n",
    "# del data # This has deleted the variable\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AmbientLight\t AnimationAction\t AnimationActionBase\t AnimationClip\t AnimationLoader\t AnimationMixer\t AnimationObjectGroup\t AnimationUtils\t Any\t \n",
      "ArcCurve\t ArrayCamera\t ArrowHelper\t Audio\t AudioAnalyser\t AudioListener\t AudioLoader\t AutogenGeometry\t AxesHelper\t \n",
      "BaseBlackbox\t BaseBufferAttribute\t BaseBufferGeometry\t BaseDataTexture\t BaseDataTexture3D\t BaseGeometry\t Blackbox\t BlendFactors\t BlendingMode\t \n",
      "Bone\t Bool\t BooleanKeyframeTrack\t Box2\t Box3\t Box3Helper\t BoxBufferGeometry\t BoxGeometry\t BoxHelper\t \n",
      "BoxLineGeometry\t BufferAttribute\t BufferGeometry\t BufferGeometryBase\t BufferGeometryLoader\t CFloat\t CInt\t Cache\t Camera\t \n",
      "CameraHelper\t CatmullRomCurve3\t CircleBufferGeometry\t CircleGeometry\t Clock\t CloneArray\t Color\t ColorKeyframeTrack\t Colors\t \n",
      "CombinedCamera\t CompressedTexture\t CompressedTextureFormats\t CompressedTextureLoader\t ConeGeometry\t Controls\t CubeCamera\t CubeTexture\t CubeTextureLoader\t \n",
      "CubicBezierCurve\t CubicBezierCurve3\t CubicInterpolant\t CullFaceModes\t Curve\t CurvePath\t CylinderBufferGeometry\t CylinderGeometry\t Cylindrical\t \n",
      "DOMWidget\t DataTexture\t DataTexture3D\t DataTextureLoader\t DataTypes\t DataUnion\t DepthFormats\t DepthMode\t DepthTexture\t \n",
      "Dict\t DirectGeometry\t DirectionalLight\t DirectionalLightHelper\t DirectionalLightShadow\t DiscreteInterpolant\t DodecahedronGeometry\t DrawModes\t EXTENSION_SPEC_VERSION\t \n",
      "EdgesGeometry\t EllipseCurve\t EndingModes\t Enum\t EnumNamespace\t Equations\t Euler\t EventDispatcher\t ExtrudeGeometry\t \n",
      "Face3\t FaceNormalsHelper\t FileLoader\t Filters\t Float\t FlyControls\t Fog\t FogExp2\t Font\t \n",
      "FontLoader\t ForwardDeclaredInstance\t FrontFaceDirection\t Frustum\t Geometry\t GridHelper\t Group\t HemisphereLight\t HemisphereLightHelper\t \n",
      "IcosahedronGeometry\t ImageBitmapLoader\t ImageLoader\t ImageTexture\t ImmediateRenderObject\t Instance\t InstancedBufferAttribute\t InstancedBufferGeometry\t InstancedInterleavedBuffer\t \n",
      "Int\t InterleavedBuffer\t InterleavedBufferAttribute\t Interpolant\t InterpolationModes\t JSONLoader\t KeyframeTrack\t LOD\t LatheBufferGeometry\t \n",
      "LatheGeometry\t Layers\t Light\t LightShadow\t Line\t Line2\t Line3\t LineBasicMaterial\t LineCurve\t \n",
      "LineCurve3\t LineDashedMaterial\t LineGeometry\t LineLoop\t LineMaterial\t LineSegments\t LineSegments2\t LineSegmentsGeometry\t LinearInterpolant\t \n",
      "List\t Loader\t LoadingManager\t LoopModes\t MappingModes\t Material\t MaterialAutogen\t MaterialLoader\t Math\t \n",
      "Matrix3\t Matrix4\t Mesh\t MeshBasicMaterial\t MeshDepthMaterial\t MeshLambertMaterial\t MeshMatcapMaterial\t MeshNormalMaterial\t MeshPhongMaterial\t \n",
      "MeshPhysicalMaterial\t MeshStandardMaterial\t MeshToonMaterial\t NDArrayWidget\t NumberKeyframeTrack\t Object3D\t Object3DBase\t ObjectLoader\t OctahedronGeometry\t \n",
      "Operations\t OrbitControls\t OrbitControlsBase\t OrthographicCamera\t Parameter\t ParametricGeometry\t Path\t PerspectiveCamera\t Picker\t \n",
      "PixelFormats\t PixelTypes\t Plane\t PlaneBufferGeometry\t PlaneGeometry\t PlaneHelper\t PlotMesh\t PointLight\t PointLightHelper\t \n",
      "Points\t PointsMaterial\t PolarGridHelper\t PolyhedronGeometry\t PositionalAudio\t Preview\t PropertyBinding\t PropertyMixer\t QuadraticBezierCurve\t \n",
      "QuadraticBezierCurve3\t Quaternion\t QuaternionKeyframeTrack\t QuaternionLinearInterpolant\t RawShaderMaterial\t Ray\t Raycaster\t RectAreaLight\t RectAreaLightHelper\t \n",
      "RenderableWidget\t Renderer\t RingBufferGeometry\t RingGeometry\t Scene\t Sequence\t ShaderChunk\t ShaderLib\t ShaderMaterial\t \n",
      "Shading\t ShadowMaterial\t ShadowTypes\t Shape\t ShapeGeometry\t ShapePath\t Side\t Signature\t Skeleton\t \n",
      "SkeletonHelper\t SkinnedMesh\t Sphere\t SphereBufferGeometry\t SphereGeometry\t Spherical\t SplineCurve\t SpotLight\t SpotLightHelper\t \n",
      "SpotLightShadow\t Sprite\t SpriteMaterial\t StereoCamera\t StringKeyframeTrack\t SurfaceGeometry\t SurfaceGrid\t TetrahedronGeometry\t TextGeometry\t \n",
      "TextTexture\t Texture\t TextureEncodings\t TextureLoader\t This\t ThreeWidget\t ToneMappings\t TorusBufferGeometry\t TorusGeometry\t \n",
      "TorusKnotBufferGeometry\t TorusKnotGeometry\t TrackballControls\t TraitError\t TraitType\t Triangle\t TubeGeometry\t Tuple\t TypedTuple\t \n",
      "Undefined\t Unicode\t Uniform\t UniformsLib\t Uninitialized\t UninitializedSentinel\t Union\t Vector2\t Vector3\t \n",
      "Vector4\t VectorKeyframeTrack\t VertexNormalsHelper\t VideoTexture\t WebGLBufferRenderer\t WebGLCapabilities\t WebGLDataUnion\t WebGLExtensions\t WebGLGeometries\t \n",
      "WebGLIndexedBufferRenderer\t WebGLLights\t WebGLObjects\t WebGLProgram\t WebGLPrograms\t WebGLProperties\t WebGLRenderTarget\t WebGLRenderTargetCube\t WebGLRenderer\t \n",
      "WebGLShader\t WebGLShadowMap\t WebGLState\t Widget\t WireframeGeometry\t WrappingModes\t a\t absolute_import\t animation\t \n",
      "audio\t c\t cameras\t controls\t core\t data\t data123\t data_file\t deserialize_uniforms\t \n",
      "display\t enums\t example_id_gen\t extras\t f\t from_json\t geometries\t get_union_array\t grid_indices_gen\t \n",
      "height_texture\t helpers\t here\t inspect\t json\t lights\t lights_color\t lights_gray\t link\t \n",
      "loaders\t make_text\t materials\t math\t name\t namedtuple\t np\t npm_pkg_name\t objects\t \n",
      "observe\t one\t os\t pd\t pi\t plt\t py_pkg_name\t pythreejs\t re\t \n",
      "register\t renderers\t scene\t scenes\t serialize_uniforms\t shape_constraints\t six\t size\t sqrt\t \n",
      "string_types\t surf\t surf2\t surf_g\t textures\t three\t to_json\t traits\t two\t \n",
      "uniforms_serialization\t unitialized_serialization\t use_example_model_ids\t validate\t version_info\t w\t warnings\t widget_serialization\t widgets\t \n",
      "\n"
     ]
    }
   ],
   "source": [
    "# %who: 列出所有的全局变量\n",
    "# 不加任何参数， %who 命令可以列出所有的全局变量。加上参数 str 将只列出字符串型的全局变量。\n",
    "\n",
    "one = \"for the money\"\n",
    "two = \"for the show\"\n",
    "three = \"to get ready now go cat go\" \n",
    "# %who str\n",
    "%who"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Wall time: 0 ns\n",
      "10.3 ms ± 74.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "10.3 ms ± 70.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "10.3 ms ± 45.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
      "10.4 ms ± 98.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-25-298500a22c1c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      7\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      8\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m     \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'timeit'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'time.sleep(0.01)# sleep for 0.01 seconds'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32md:\\users\\bianhaiyuan198\\python36\\lib\\site-packages\\IPython\\core\\interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[1;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[0;32m   2283\u001b[0m                 \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'local_ns'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msys\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2284\u001b[0m             \u001b[1;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2285\u001b[1;33m                 \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2286\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2287\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<decorator-gen-62>\u001b[0m in \u001b[0;36mtimeit\u001b[1;34m(self, line, cell, local_ns)\u001b[0m\n",
      "\u001b[1;32md:\\users\\bianhaiyuan198\\python36\\lib\\site-packages\\IPython\\core\\magic.py\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(f, *a, **k)\u001b[0m\n\u001b[0;32m    185\u001b[0m     \u001b[1;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    186\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 187\u001b[1;33m         \u001b[0mcall\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    188\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    189\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\users\\bianhaiyuan198\\python36\\lib\\site-packages\\IPython\\core\\magics\\execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[1;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[0;32m   1100\u001b[0m                     \u001b[1;32mbreak\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1101\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1102\u001b[1;33m         \u001b[0mall_runs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnumber\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1103\u001b[0m         \u001b[0mbest\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1104\u001b[0m         \u001b[0mworst\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\users\\bianhaiyuan198\\python36\\lib\\timeit.py\u001b[0m in \u001b[0;36mrepeat\u001b[1;34m(self, repeat, number)\u001b[0m\n\u001b[0;32m    204\u001b[0m         \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    205\u001b[0m         \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 206\u001b[1;33m             \u001b[0mt\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    207\u001b[0m             \u001b[0mr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    208\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32md:\\users\\bianhaiyuan198\\python36\\lib\\site-packages\\IPython\\core\\magics\\execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[1;34m(self, number)\u001b[0m\n\u001b[0;32m    157\u001b[0m         \u001b[0mgc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    158\u001b[0m         \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 159\u001b[1;33m             \u001b[0mtiming\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minner\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mit\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    160\u001b[0m         \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    161\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m<magic-timeit>\u001b[0m in \u001b[0;36minner\u001b[1;34m(_it, _timer)\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# 计时 %time\n",
    "\n",
    "# %timeit.当你有一些很耗时的代码，想要查清楚问题出在哪时，这两个命令非常给力。 \n",
    "# %time 会告诉你cell内代码的单次运行时间信息。\n",
    "\n",
    "%time\n",
    "import time\n",
    "for _ in range(5):\n",
    "    %timeit time.sleep(0.01)# sleep for 0.01 seconds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10.3 µs ± 793 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n"
     ]
    }
   ],
   "source": [
    "import numpy\n",
    "%timeit numpy.random.normal(size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %pycat把外部文件语法高亮显示（以弹出窗方式）。\n",
    "%pycat D:\\Users\\bianhaiyuan198\\DevelopProject\\gulf_project\\temp_src\\temp.py\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " "
     ]
    }
   ],
   "source": [
    "# %prun: 告诉你程序中每个函数消耗的时间\n",
    "# 使用%prun+函数声明会给你一个按顺序排列的表格，显示每个内部函数的耗时情况，每次调用函数的耗时情况，以及累计耗时。\n",
    "import numpy\n",
    "def append_if_not_exists(arr, x):\n",
    "    if x not in arr:\n",
    "        arr.append(x)\n",
    "\n",
    "def some_useless_slow_function():\n",
    "    arr = list()\n",
    "    for i in range(10000):\n",
    "        x = numpy.random.randint(0, 10000)\n",
    "        append_if_not_exists(arr, x)\n",
    "%prun some_useless_slow_function()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Automatic pdb calling has been turned ON\n"
     ]
    },
    {
     "ename": "NotImplementedError",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-28-cf3b2ebe427f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      7\u001b[0m     \u001b[1;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      8\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-28-cf3b2ebe427f>\u001b[0m in \u001b[0;36mpick_and_take\u001b[1;34m()\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      6\u001b[0m     \u001b[0mpicked\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1000\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m     \u001b[1;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      8\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      9\u001b[0m \u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNotImplementedError\u001b[0m: "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "> \u001b[1;32m<ipython-input-28-cf3b2ebe427f>\u001b[0m(7)\u001b[0;36mpick_and_take\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32m      5 \u001b[1;33m\u001b[1;32mdef\u001b[0m \u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0m\u001b[1;32m      6 \u001b[1;33m    \u001b[0mpicked\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1000\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0m\u001b[1;32m----> 7 \u001b[1;33m    \u001b[1;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0m\u001b[1;32m      8 \u001b[1;33m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0m\u001b[1;32m      9 \u001b[1;33m\u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0m\n",
      "ipdb> l\n",
      "\u001b[0;32m      2 \u001b[0m\u001b[1;31m# Jupyter 有自己的调试界面The Python Debugger (pdb)，使得进入函数内部检查错误成为可能。\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m      3 \u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m      4 \u001b[0m\u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'pdb'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m''\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m      5 \u001b[0m\u001b[1;32mdef\u001b[0m \u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m      6 \u001b[0m    \u001b[0mpicked\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1000\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m----> 7 \u001b[1;33m    \u001b[1;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0m\u001b[0;32m      8 \u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m      9 \u001b[0m\u001b[0mpick_and_take\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\n",
      "ipdb> c\n"
     ]
    }
   ],
   "source": [
    "# 用%pdb调试程序\n",
    "# Jupyter 有自己的调试界面The Python Debugger (pdb)，使得进入函数内部检查错误成为可能。 \n",
    "\n",
    "%pdb\n",
    "def pick_and_take():\n",
    "    picked = numpy.random.randint(0, 1000)\n",
    "    raise NotImplementedError()\n",
    "    \n",
    "pick_and_take()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 末句函数不输出\n",
    "# 有时候不让末句的函数输出结果比较方便，比如在作图的时候，此时，只需在该函数末尾加上一个分号即可。\n",
    "\n",
    "%matplotlib inline\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy\n",
    "x = numpy.linspace(0, 1, 10)**2\n",
    "# Here you get the output of the function\n",
    "plt.hist(x);\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 驱动器 D 中的卷是 DataVolume\n",
      " 卷的序列号是 F66C-CD2E\n",
      "\n",
      " D:\\Users\\bianhaiyuan198\\DevelopProject\\gulf_project\\jupyters 的目录\n",
      "\n",
      "2018-11-01  19:25    <DIR>          .\n",
      "2018-11-01  19:25    <DIR>          ..\n",
      "2018-10-31  08:58    <DIR>          .ipynb_checkpoints\n",
      "2018-11-01  19:23             1,237 helloworld.ipynb\n",
      "2018-11-01  19:25           388,174 Jupyter Notebook练习手册.ipynb\n",
      "2018-10-25  10:39            12,644 NaenvInfo.ipynb\n",
      "2018-10-25  16:52            13,709 static_bug_shenbing_diagram.py\n",
      "2018-10-31  17:07             1,358 tempPy.ipynb\n",
      "2018-10-25  10:39             7,174 Untitled.ipynb\n",
      "2018-11-01  19:09                 0 untitled.txt\n",
      "               7 个文件        424,296 字节\n",
      "               3 个目录 111,288,872,960 可用字节\n"
     ]
    }
   ],
   "source": [
    "# 运行Shell命令\n",
    "# 在notebook内部运行shell命令很简单，这样你就可以看到你的工作文件夹里有哪些数据集。\n",
    "\n",
    "#!ls *.csv\n",
    "!dir"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基本数据分析示例\n",
    "\n",
    "*这是真正实用的部分，希望大家多多学习和应用，能够极大的提高工作效率的*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to  previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"432\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0xf2031f0>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 基本数据分析, 示例\n",
    "# matplotlib是一个用于创建出版质量图表的桌面绘图包（主要是2D方面）。\n",
    "# 该项目是由John Hunter于2002年启动的，其目的是为Python构建一个MATLAB式的绘图接口。\n",
    "# matplotlib和IPython社区进行合作，简化了从IPython shell（包括现在的Jupyter notebook）进行交互式绘图。\n",
    "# matplotlib支持各种操作系统上许多不同的GUI后端，而且还能将图片导出为各种常见的矢量（vector）和光栅（raster）图：PDF、SVG、JPG、PNG、BMP、GIF等。\n",
    "%matplotlib notebook\n",
    "\n",
    "# matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure：\n",
    "# plt.figure有一些选项，特别是figsize，它用于确保当图片保存到磁盘时具有一定的大小和纵横比。\n",
    "# 不能通过空Figure绘图。必须用add_subplot创建一个或多个subplot才行\n",
    "# \n",
    "fig = plt.figure()\n",
    "ax1 = fig.add_subplot(2, 2, 1)\n",
    "# 这条代码的意思是：图像应该是2×2的（即最多4张图），且当前选中的是4个subplot中的第一个（编号从1开始）。\n",
    "ax2 = fig.add_subplot(2, 2, 2)\n",
    "ax3 = fig.add_subplot(2, 2, 3)\n",
    "ax4 = fig.add_subplot(2, 2, 4)\n",
    "# 如果再把后面两个subplot也创建出来，最终得到的图像\n",
    "# 提示：使用Jupyter notebook有一点不同，即每个小窗重新执行后，图形会被重置。\n",
    "# 因此，对于复杂的图形，，你必须将所有的绘图命令存在一个小窗里。\n",
    "\n",
    "#如果这时执行一条绘图命令（如plt.plot([1.5, 3.5, -2, 1.6])），matplotlib就会在最后一个用过的subplot（如果没有则创建一个）上进行绘制，隐藏创建figure和subplot的过程。\n",
    "# 因此，如果我们执行下列命令，下图所示的结果：\n",
    "plt.plot([1.5, 3.5, -2, 1.6], 'k--')\n",
    "# plt.plot(np.random.randn(50).cumsum(), 'k--')\n",
    "_ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)\n",
    "#ax4 = plt.plot([1.5, 3.5, -2, 1.6])\n",
    "\n",
    "ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))\n",
    "# \"k--\"是一个线型选项，用于告诉matplotlib绘制黑色虚线图。\n",
    "# 上面那些由fig.add_subplot所返回的对象是AxesSubplot对象，直接调用它们的实例方法就可以在其它空着的格子里面画图了，"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0xe3649b0>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from numpy.random import randn\n",
    "plt.plot(randn(30).cumsum(), 'ko--')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.14781512,  2.35496324,  3.37009891,  2.72362283,  1.9941848 ,\n",
       "        1.861548  , -0.89358448, -0.70480937,  0.17885916, -0.03222189,\n",
       "        0.36939875,  0.99599879,  1.30667275,  2.4938801 ,  2.45865398,\n",
       "        2.87385143,  1.95847302,  3.44877503,  1.37947239,  0.33482416,\n",
       "        0.2669916 ,  0.69434173, -0.0903409 , -0.99922926, -1.16636201,\n",
       "       -1.28348231, -1.46484108, -0.78858917, -1.08632835, -2.01853889])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机生成30个数据\n",
    "randn(30).cumsum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 了解交互式图表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e3e5a41464d747b4be6c3d80dc3776a9",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "IntSlider(value=0)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 交互式widgets\n",
    "from IPython.display import display\n",
    "import ipywidgets as widgets\n",
    "# widgets.IntSlider()\n",
    "w = widgets.IntSlider()\n",
    "display(w)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 了解图表分析，散点图分析法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "a7b5898c9b1a41bda9b9ffd7fe2f328c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "VBox(children=(Figure(axes=[ColorAxis(scale=ColorScale()), Axis(scale=LinearScale()), Axis(orientation='vertic…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib notebook\n",
    "\n",
    "# 散点图分析法\n",
    "import numpy as np\n",
    "import bqplot.pyplot as plt\n",
    "\n",
    "size = 100\n",
    "\n",
    "plt.figure(title='Scatter plot with colors')\n",
    "plt.scatter(np.random.randn(size), np.random.randn(size), color=np.random.randn(size))\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "幻灯片",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
